package com.sinevil.tcpTrans.entity.json;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.util.regex.Pattern;

/**
 * @Classname InstructionJson
 * @Description TODO
 * @Version 1.0.0
 * @Date 2024/12/12 19:41
 * @Created by sinevil
 */
@Data
public class InstructionJson extends BasicJson{

    /**
     * 断开连接
     */
    public static final int CLOSE_CONNECT = 1010_0001;

    /**
     * 第三位 0表示公共信息 1表示服务端信息 2表示客户端信息
     * 第四位 1表示正常信息，2表示异常信息
     * <p>
     * 101_0_0000 表示服务端发送的指令
     * 101_1_0000 表示服务端正常指令
     * 101_2_0000 表示服务端异常指令
     * 101_0_1000 表示服务端发送普通指令
     * 101_0_2000 表示服务端与文件传输相关指令
     * <p>
     * 102_0_0000 表示客户端发送的指令
     * 102_1_0000 表示客户端发送正常指令
     * 102_2_0000 表示客户端发送异常指令
     * 102_0_1000 表示客户端发送普通指令
     * 102_0_2000 表示服务端与文件传输相关指令
     */

    // 服务端相关指令

    /**
     *客户端 请求下上传文件时,服务端发生错误
     *
     */
    public static final int SERVER_ERROR_CLIENT_UPLOAD_FILE = 101_2_2_001;
    public static final Pattern SERVER_ERROR_CLIENT_UPLOAD_FILE_PATTERN = Pattern.compile("MD5\\((.*?)\\),size\\((.*?)\\),name\\((.*?)\\)");
    public static final String SERVER_ERROR_CLIENT_UPLOAD_FILE_FORMAT = "MD5(%s),size(%d),name(%s)";

    /**
     * 服务端 检测到传送文件完成
     */
    public static final int SERVER_UPLOAD_FILE_COMPLETE = 101_1_2_004;
    public static final Pattern SERVER_UPLOAD_FILE_COMPLETE_PATTERN = Pattern.compile("MD5\\((.*?)\\)");



    // 客户端相关指令


    /**
     * 客户端请求文件指令
     * <p>
     * 内容格式: "file(位置)"
     */
    public static final int ClIENT_REQUEST_FILE = 102_1_2_001;
    public static final Pattern ClIENT_REQUEST_FILE_PATTERN = Pattern.compile("file\\((.*?)\\)");
    public static final String ClIENT_REQUEST_FILE_FORMAT = "file(%s)";//文件路径



    // 公共指令



    /**
     * 文件基本信息
     * 可能是客户端请求下载文件时由服务端发送
     * 也可能客户端请求上传文件时由客户端直接发送
     * <p>
     * 内容格式: "UID(任务唯一标识),size(文件大小),slice(预计切片个数),name(文件名)"
     */
    public static final int PUBLIC_FILE_INFO = 100_1_1001;
    public static final Pattern PUBLIC_FILE_INFO_PATTERN = Pattern.compile("UID\\((.*?)\\),size\\((.*?)\\),name\\((.*?)\\),path\\((.*?)\\)");
    public static final String PUBLIC_FILE_INFO_FORMAT = "UID(%s),size(%d),name(%s),path(%s)";

    /**
     * 请求 文件数据包
     * <p>
     * 内容格式："UID(任务唯一标识),offset(请求的数据包起始位置),size(请求的数据包大小)"
     */
    public static final int PUBLIC_REQUEST_FILE_PACKET = 100_1_1002;
    public static final Pattern PUBLIC_REQUEST_FILE_PACKET_PATTERN = Pattern.compile("UID\\((.*?)\\),offset\\((.*?)\\),size\\((.*?)\\)");
    public static final String PUBLIC_REQUEST_FILE_PACKET_FORMAT = "UID(%s),offset(%d),size(%d)";

    /**
     * 上传失败，未找到对应上传任务
     * <p>
     * 内容格式："UID(任务唯一标识)"
     */
    public static final int PUBLIC_UPLOAD_FAIL = 100_1_1003;
    public static final Pattern PUBLIC_UPLOAD_FAIL_PTTERN = Pattern.compile("UID\\((.*?)\\)");;
    public static final String PUBLIC_UPLOAD_FAIL_FORMAT = "UID(%s)";

    /**
     * 下载端检测到文件下载完成，返回信息（文件是否完成）
     * 可能是客户端下载完成，也可能是服务端接收客户端上传完成
     * 标志为1时需要上传端返回文件MD5，标志为2时需要上传端结束对应上传任务回收资源
     * <p>
     * 内容格式："UID(上传任务唯一标识),mark(标志（1表示返回文件MD5，2表示任务完成回收资源）),content(信息)"
     */
    public static final int PUBLIC_REQUEST_FILE_COMPLETE = 100_1_0011;
    public static final Pattern PUBLIC_REQUEST_FILE_COMPLETE_PATTERN = Pattern.compile("UID\\((.*?)\\),mark\\((.*?)\\),content\\((.*?)\\)");

    public static final String PUBLIC_REQUEST_FILE_COMPLETE_FORMAT = "UID(%s),mark(%d),content(%s)";
    /**
     * 上传端发送文件MD5
     * 内容格式："UID(上传任务唯一标识),MD5(文件MD5标识)"
     */
    public static final int PUBLIC_FILE_MD5 = 100_1_0012;
    public static final Pattern PUBLIC_FILE_MD5_PATTERN = Pattern.compile("UID\\((.*?)\\),MD5\\((.*?)\\)");
    public static final String PUBLIC_FILE_MD5_FORMAT = "UID(%s),MD5(%s)";

    /**
     * 请求下载文件时,上传发生错误
     * 如：文件不存在
     */
    public static final int PUBLIC_UPLOAD_ERROR_REQUEST_FILE = 101_2_2_001;
    public static final Pattern PUBLIC_UPLOAD_ERROR_REQUEST_FILE_PATTERN = Pattern.compile("file\\((.*?)\\),content\\((.*?)\\)");
    public static final String PUBLIC_UPLOAD_ERROR_REQUEST_FILE_FORMAT = "file(%s),content(%s)";




    @JsonProperty("code")
    public int code;

    @JsonProperty("content")
    public String content;

    public InstructionJson(){
        super();
        this.type = "instruction";
    }

    public InstructionJson(int code, String content){
        this();
        this.code = code;
        this.content =  content;
    }
    @Override
    public String toString() {
        return "InstructionJson{" +
                "type='" + type + '\'' +
                ", code=" + code +
                ", content='" + content + '\'' +
                '}';
    }
}